/*
* Copyright (c) Microsoft Corporation. All rights reserved.
* Copyright (c) 2023 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*     http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* This file has been modified by Huawei to verify type inference by adding verification statements.
*/

// === tests/cases/compiler/capturedLetConstInLoop12.ts ===
declare function AssertType(value:any, type:string):void;
(function() {
AssertType((function() {    "use strict";    for (let i = 0; i < 4; i++) {        (() => [i] = [i + 1])();    }})(), "void");
AssertType((function() {    "use strict";    for (let i = 0; i < 4; i++) {        (() => [i] = [i + 1])();    }}), "() => void");
AssertType(function() {    "use strict";    for (let i = 0; i < 4; i++) {        (() => [i] = [i + 1])();    }}, "() => void");

    "use strict";
AssertType("use strict", "string");

    for (let i = 0; i < 4; i++) {
AssertType(i, "number");
AssertType(0, "int");
AssertType(i < 4, "boolean");
AssertType(i, "number");
AssertType(4, "int");
AssertType(i++, "number");
AssertType(i, "number");

        (() => [i] = [i + 1])();
AssertType((() => [i] = [i + 1])(), "[number]");
AssertType((() => [i] = [i + 1]), "() => [number]");
AssertType(() => [i] = [i + 1], "() => [number]");
AssertType([i] = [i + 1], "[number]");
AssertType([i], "[number]");
AssertType(i, "number");
AssertType([i + 1], "[number]");
AssertType(i + 1, "number");
AssertType(i, "number");
AssertType(1, "int");
    }
})();

(function() {
AssertType((function() {    "use strict";    for (let i = 0; i < 4; i++) {        (() => ({a:i} = {a:i + 1}))();    }})(), "void");
AssertType((function() {    "use strict";    for (let i = 0; i < 4; i++) {        (() => ({a:i} = {a:i + 1}))();    }}), "() => void");
AssertType(function() {    "use strict";    for (let i = 0; i < 4; i++) {        (() => ({a:i} = {a:i + 1}))();    }}, "() => void");

    "use strict";
AssertType("use strict", "string");

    for (let i = 0; i < 4; i++) {
AssertType(i, "number");
AssertType(0, "int");
AssertType(i < 4, "boolean");
AssertType(i, "number");
AssertType(4, "int");
AssertType(i++, "number");
AssertType(i, "number");

        (() => ({a:i} = {a:i + 1}))();
AssertType((() => ({a:i} = {a:i + 1}))(), "{ a: number; }");
AssertType((() => ({a:i} = {a:i + 1})), "() => { a: number; }");
AssertType(() => ({a:i} = {a:i + 1}), "() => { a: number; }");
AssertType(({a:i} = {a:i + 1}), "{ a: number; }");
AssertType({a:i} = {a:i + 1}, "{ a: number; }");
AssertType({a:i}, "{ a: number; }");
AssertType(a, "number");
AssertType(i, "number");
AssertType({a:i + 1}, "{ a: number; }");
AssertType(a, "number");
AssertType(i + 1, "number");
AssertType(i, "number");
AssertType(1, "int");
    }
})();

